GetKrnlBaseLoop: ;ide hladat zaciatocnu (base) adresu KERNEL32.DLL v pamati
xor edx,edx ;nuluje register edx
dec ecx ;hlada spatne
mov dx,[ecx+03ch] ;pokusa sa nacitat z MZ casti hlavicky suboru, start PE hlavicky
test dx,0f800h ;testuje, ci nasiel spravnu hodnotu
jnz GetKrnlBaseLoop ;ak nie, skok hladat dalej
cmp ecx,[ecx+edx+34h] ;porovna aktualnu adresu s adresou, kam tento PE subor (KERNEL32.DLL) mal byt nahraty (jeho Image Base)
;zjednodusene povedane testuje, ci nasiel zaciatok KERNEL32.DLL
jnz GetKrnlBaseLoop ;ak je rozdielna, skoci hladat dalej
mov [KernelAdress],ecx ;nasiel zaciatocnu (base) adresu KERNEL32.DLL a ulozi ju
mov ebx,ecx ;do EBX da zaciatocnu (base) adresu KERNEL32.DLL
or ebx,ebx
jz continiue ;ak nenasiel zaciatok KERNEL32.DLL, nastala chyba a skoci (ak je EBX=0)
mov eax,dword ptr [ebx+3ch] ;nacita z MZ casti hlavicky suboru, start PE hlavicky
add eax,ebx ;nastavi register EAX na start PE hlavicky
mov edi,dword ptr [eax+NT_OptionalHeader. \
OH_DirectoryEntries. \
DE_Export. \
DD_VirtualAddress] ;nacita relativnu virtualnu adresu na Export Table
;to je vlasne mov edi,dword ptr [eax+78h]
add edi,ebx ;nastavi sa na Export Table v KERNEL32.DLL
;tu hlada adresu volania Kernel32!ord_0001
;vstupne hodnoty su:
;ebx = zaciatocna (base) adresa KERNEL32.DLL
;edi = adresa Export Table v subore KERNEL32.DLL
mov esi,dword ptr [edi+ED_AddressOfFunctions] ;nacita RVA adresu na zoznam exportovanych funkcii
;to je vlastne mov esi,dword ptr [edi+1ch]
add esi,ebx ;nastavi sa na zoznam exportovanych funkcie
xor edx,edx ;nuluje register edx (bude pocitadlo)
address_loop: cmp edx,dword ptr [edi+ED_NumberOfFunctions] ;testuje edx (pocitadlo) s poctom exportovanych funkcii a tak zistuje, ci uz testoval vsetky
;to je vlastne cmp edx,dword ptr [edi+14h]
jae continiue ;ak ano skok, pretoze nenasiel VxDCall (KERNEL32!ORD_0001) a to je chyba
mov ecx,00000008h-01h ;do registra cx da 7, cize bude 8 krat opakovat
function_loop: inc edx ;zvisi edx (pocitadlo) o 1
lodsd ;nacita adresu exportovanej funkcie
cmp eax,dword ptr [esi] ;testuje, ci je to start PE hlavicky KERNEL32.DLL
jne address_loop ;ak nie, skok hladat dalej
loop function_loop ;ak ano testuje este sedem krat,
add eax,ebx ;v registri eax je RVA adresa pre VxDCall (KERNEL32!ORD_0001) a pripocitanim hodnoty z registra ebx, co je zaciatocna (base) adresa KERNEL32.DLL v pamati sa nastavi na realnu adresu VxDCall
mov dword ptr [a_VxDCall],eax ;ulozi adresu pre VxDCall (KERNEL32!ORD_0001)
;samotna detekcia Soft-Ice zacina az tu
push 0000004fh ;funkcia 4fh, ta ista ako v priklade 9
push 002a002ah ;horne slovo urcuje, ktory typ VxD volania je volany (VWIN32)
;dolne slovo urcuje, ktora funkcia je volana (VWIN32_Int41Dispatch)